home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d12 / c_toolbx.arc / GETSPEC.C < prev    next >
Encoding:
C/C++ Source or Header  |  1988-03-30  |  3.6 KB  |  136 lines

  1. /*  getspec.c - get sort file spec from cmd line */
  2. #include   "stdio.h"
  3. #include   "cminor.h"
  4. #include   "sortcomp.h"
  5. #include   "merge1.h"
  6. #include   "sortspec.h"
  7.  
  8. int  nkeys ;            /* number of sort keys defined */
  9. SORTKEY keys[ MAX_KEYS ] ;    /* data to describe the sort keys */
  10. SORTSPEC sspec ;        /* sort spec. info - fun. address */
  11.  
  12. /* declare functions before we use their addresses */
  13. int  getl(), getr(), putl(), putr(), sortcomp() ;
  14.  
  15. getspec(argc,argv)
  16.   int    argc ;
  17.   char    *argv[] ;
  18.   {
  19.      int   i ;
  20.      char  *p ;
  21.  
  22.      /* set up defaults for file type, record type & sort fields */
  23.      sspec.ftype     =    ASC_MODE ;
  24.      sspec.pget      =    getl ;
  25.      sspec.pput      =    putl ;
  26.      sspec.pcomp     =    sortcomp ;
  27.      sspec.rec_size  =    MAX_RSIZE ;
  28.      nkeys = 0 ;
  29.  
  30.      for( i=3 ; i < argc ; i=i+1 )
  31.     {
  32.        p = argv[i] ;
  33.        if( *p == '-')       /* check for dash */
  34.           dospec(p+1) ;    /* move past dash, get this spec. */
  35.        else err_msg("bad option format \n") ;
  36.     }
  37.      if( nkeys == 0 )        /* use char string as default key */
  38.     addkey(string_key,ASCENDING,0,sspec.rec_size) ;
  39.   }
  40.  
  41.  
  42.  
  43. int  dospec(p)            /* classify and process one spec */
  44.   char    *p ;            /* points to spec. char (and parms) */
  45.   {
  46.      switch( *p )        /* classify the next char */
  47.     {
  48.     case 'r' :              /* fixed length records */
  49.        sspec.pget    = getr ;
  50.        sspec.pput    = putr ;
  51.        p = p + 1 ;        /* move past 'r' */
  52.                 /* and get record size */
  53.        sspec.rec_size = -1 ;/* use invalid size to insure */
  54.        sscanf(p,"%d",&sspec.rec_size) ; /* that sscanf reads it */
  55.        if( ( sspec.rec_size < 0 )    /* validate record size */
  56.           || ( sspec.rec_size > MAX_RSIZE) )
  57.           err_msg(" bad record size field \n") ;
  58.        break ;
  59.     case  '1' :             /* records are text lines */
  60.        sspec.pget    = getl ;
  61.        sspec.pput    = putl ;
  62.        break ;
  63.     case  'a' :             /* ASCII file - check for CTL-Z */
  64.        sspec.ftype    = ASC_MODE ;
  65.        break ;
  66.     case  'b' :             /* binary file - no check for CTL-Z */
  67.        sspec.ftype    = BIN_MODE ;
  68.        break ;
  69.     case  'k' :             /* key field spec. */
  70.        if( nkeys == MAX_KEYS )
  71.           err_msg("too many sort keys \n") ;
  72.        p = p + 1 ;        /* move past the 'k' */
  73.        getkparm(p) ;    /* get and check key parms. */
  74.        break ;
  75.     default  :
  76.        err_msg("bad option\n") ;
  77.        break ;
  78.     }
  79.   }
  80.  
  81.  
  82. int  getkparm(word)        /* collect and verify key info */
  83.   char    word[] ;        /* string wirh the parms */
  84.   {
  85.      int kt, ko, ks, kl, n ;
  86.      char tc, oc ;
  87.      /* get perms from cmd. line word */
  88.      kl = -1 ;
  89.      sscanf(word,"%c,%c,%d,%d",&tc,&oc,&ks,&kl) ;
  90.      if( kl == -1 )
  91.     err_msg("not enough info in key field \n:") ;
  92.  
  93.                 /* convert and check field type */
  94.  
  95.      kt = sindex( tc,"icslf") ;
  96.      if(kt < 0 )
  97.     err_msg("bad key field type\n") ;
  98.  
  99.      if( oc == 'a' )            /* convert and check sort order */
  100.     ko = ASCENDING ;
  101.      else if( oc == 'd')
  102.     ko = DESCENDING ;
  103.      else err_msg("bad key field order \n") ;
  104.  
  105.                 /* check starting offset */
  106.      if( (ks < 0 ) || (ks > sspec.rec_size) )
  107.     err_msg("bad key fiels offset \n") ;
  108.                 /* check field length */
  109.      if( (kl <= 0) || ( (ks + kl) > sspec.rec_size) )
  110.     err_msg("bad key field length \n") ;
  111.      addkey(kt,ko,ks,kl) ;
  112.   }
  113.  
  114.  
  115. int  addkey(itype,iorder,ioffset,ilength)
  116.   int    itype, iorder, ioffset , ilength ;
  117.   {
  118.      keys[nkeys].ktype    =    itype ;
  119.      keys[nkeys].korder =    iorder ;
  120.      keys[nkeys].kstart =    ioffset ;
  121.      keys[nkeys].klength =    ilength ;
  122.      nkeys = nkeys + 1 ;
  123.   }
  124.  
  125.  
  126. int err_msg(s)
  127.   char    s[] ;
  128.   {
  129.      printf("%s \n",s) ;
  130.      exit(10) ;
  131.   }
  132.  
  133.  
  134.  
  135.  
  136.